/*
数组：
    概念：系统会分配一段连续空间存储相同类型的数据
    定义一维数组： 数据类型  数组名[常量表达式/数组大小];
                int  num[10];//表示可以存储10个整数
            可以将数组num看作是10个变量   ：num[0] ----num[9]
    数组元素的引用  ：数组名[下标]    在数组中下标是从0开始的   ，在上面数组num中不存在num[10]这个元素
    对数组元素的输入 和输出
    数组名 就是首地址 （首元素的地址）  
    数组的初始化赋值    【如果赋值数据的个数不足数组大小时，那么后面的元素值默认为0】
            int num[10]={1,2,3,4,5,6,7,8,9,0};//对数组的每一个元素初始化赋值
            int num1[10]={0};//对数组元素初始化赋值为0。每一个元素的值都为0
            int num2[10]={1};//如果赋值数据的个数不足数组大小时，那么后面的元素值默认为0
            int num5[]={1,2,3};//此时数组的长度 为3  ，如果在定义数据时没有确定数组的长度，那么会根据实际赋值的个数来决定数组的大小
                    如果在定义数组时，没有给定数组大小，必须初始化赋值
在C语言中对数组的越界访问不做处理，但最好不要这么做
数组大小  sizeof(数组名)/sizeof(数据类型)==》数组的元素个数
数组 循环不分家（一般情况下）

    二位数组定义：数据类型 数组名[常量表达式][常量表达式];
                int num[3][4];//可以将二维数组理解为是3行4列的矩阵  同样的行下标/列下标从0开始的
                实质上在内存中它还是连续的存储空间
        元素引用  数组名[行下标][列下标]   可以将每一个元素看作是一个变量   结合双重循环访问数组元素
    
    初始化赋值：
                int num[4][3]={1,2,3,4};//默认前3个认为是第0行的内容  
                int num1[4][3]={{1,2},{3},{4}};
                分别表示将1，2赋值给num[0][0]  num[0][1]，该行其他的元素值为0
                        将3 赋值给 num[1][0],该行其他的元素值为0
                        将4  赋值给num[2][0]，该行其他的元素值为0
                  不可以这么写   ，!!!int num[][]={1,2,3,4};
                int num[][3]={1,2,3,4,5,6,7,8,9};//这么写可以  ，数组大小会根据实际赋值个数/列数==》行数  
    数组名就是首地址（首元素的地址/首行的起始地址）
    在二维数组中，可以将每一行看作是一个一维数组，数组名[行下标]：  就是当前行的首地址 
                                    int num[3][4];  num[2]<===>&num[2][0]
多维数组  --三维数组
        int num[3][4][5];
字符数组与字符串
    字符数组  ：char 数组名[常量表达式];
    同样也可以对元素进行访问，与数值数组无异     
    字符串:双引号引起来的内容，默认以'\0'字符结尾
    数组名   就是首地址 ，
    在字符串中通过首地址 访问一串字符
    字符串的格式占位符  ：%s

    字符串输出函数puts
    字符串的输入 ：
            fgets()
            scanf("%s",str);
    
 */


#include <stdio.h>
int main(void)
{
    //通过下标实现字符串反序存放

    char str[100]={0};//'\0'的ASCII码值是0
    printf("请输入一串字符：\n");
    fgets(str,sizeof(str),stdin);//stdin:输入IO流文件
    //scanf("%s",str);//遇到空格会停止读取
    printf("%s\n",str);
    // int len;
    // printf("len=%zu\n",sizeof(str));
    //实际字符个数---字符串的长度


    // char str[5]={'h','e','l','l','o'};
    // char buf[6]={"hello"};//字符串后面会默认有一个结束字符'\0', 所以在这个字符数组Buf中
    // int i;
    // printf("str:\n");
    // for(i=0;i<5;i++)
    // {
    //     printf("%c\t",str[i]);
    // }
    // printf("\n");
    // puts(str);
    // printf("str:%s\n",str);

    // printf("bufr:\n");
    // for(i=0;i<5;i++)
    // {
    //     printf("%c\t",buf[i]);
    // }
    // printf("\n");
    // puts(buf);
    // printf("buf:%s\n",buf);


    // //二维数组
    // //数组名就是首地址（(首元素的地址/首行的起始地址)
    // 在二维数组中，可以将每一行看作是一个一维数组，数组名[行下标]: 就是当前行的首地址
    // int num[3][4]={0};
    // int i;
    // printf("num:%p\n",num);
    // printf("&num[0][0]:%p\n",&num[0][0]);
    // printf("num[0]:%p\n",num[0]);
    // //可以将二维数组看作是多个一维数组   数组名[行下标]    就是该一维数组的首地址
    // for(i=0;i<3;i++)
    // {
    //     printf("num[%d]:%p\t",i,num[i]);
    //     printf("&num[%d][0]:%p\n",i,&num[i][0]);
    // }

    // int num[3][3]={{1,2,5},{3},{4}};
    // //int num[3][3]={1,2,3,4};
    // for(int i=0;i<3;i++)
    // {
    //     for(int j=0;j<3;j++)
    //     {
    //         printf("%d  ",num[i][j]);
    //     }
    //     printf("\n");
    // }
    // int num1[][4]={{1,2},{3,4,5},{6},{7},{8},9};
    // printf("数组num1的大小为%zu个字节\n",sizeof(num1));
    // int num2[][4]={1,2,3,4,5,6,7,8,9};
    // printf("数组num2的大小为%zu个字节\n",sizeof(num2));

    // int num[4][3]={1,2,3,4};//4:[1][0]
    // int i,j;
    // printf("地址编号\n");
    // for(i=0;i<4;i++)
    // {
    //     for(j=0;j<3;j++)
    //     {
    //         printf("&num[%d][%d]:%p  ",i,j,&num[i][j]);
    //     }
    //     printf("\n");
    // }
    // //printf("num[0][3]:%d\n",num[0][3]);可以访问 但不要这样写
    return 0;
}

// #include <stdio.h>
// int main(void)
// {
//     //一维数组反序存放
//     int num[10]={1,2,3,4,5,6,7,8,9,10};
//     //遍历数组
//     for(int i=0;i<10;i++)//当前这个变量i写在for语句中，它只在for语句有效
//     {
//         printf("%d\t",num[i]);
//     }
//     printf("\n");
//     //反序操作
//     for(int i=0,j=9;i<j;i++,j--)
//     {
//         int t=num[i];
//         num[i]=num[j];
//         num[j]=t;
//     }
//     //遍历数组
//     for(int i=0;i<10;i++)
//     {
//         printf("%d\t",num[i]);
//     }
//     printf("\n");
//     return 0;
// }

// {
//     //输入10个整数，求最大值
//     int num[10]={0};//定义数组并初始化赋值为0
//     int i;//循环变量 用来循环数组的下标
//     int max;
//     //输入10个整数
//     printf("请输入十个整数；");
//     for(i=0;i<10;i++)
//     {
//         scanf("%d",&num[i]);
//     }
//     //求最大值
//     //先假设max是num[0]
//     max=num[0];
//     for(i=1;i<10;i++)
//     {
//         //拿当前的max以此与每一个元素去进行比较
//         if(num[i]>max)
//         {
//             //更新最大值
//             max=num[i];
//         }
//     }
//     printf("max=%d\n",max);
//     return 0;
// }

// #include <stdio.h>
// int main(void)
// {
//     int num[10]={0};//定义一个数组
//     int i;//循环数组下标
//     //遍历数组
//     printf("遍历数组\n");
//     for(i=0;i<10;i++)
//     {
//         printf("%d\t",num[i]);
//     }
//     printf("\n----------------------------------\n");
//     printf("请输入10个整数");
//     //对数组输入
//     for(i=0;i<10;i++)
//     {
//         scanf("%d",&num[i]);
//     }
//     //遍历数组
//     printf("遍历数组\n");
//     for(i=0;i<10;i++)
//     {
//         printf("%d\t",num[i]);
//     }
//     printf("\n----------------------------------\n");
//     printf("数组元素的地址：\n");
//     for(i=0;i<10;i++)
//     {
//         printf("&num[%d],%p\n",i,&num[i]);//地址
//     }
//     printf("\n");
//     printf("num:%p\n",num);//数组中的首个元素
//     return 0;
// }